/**
 *  @brief Czesc menadzera okien odpowiadajaca za widgety oraz
 *  zdarzenia, ktore moga one odbierac.
 *
 *  @file Widget.h
 *  @author t0m_k
 *  @date 05.12.10
**/
#ifndef __WIDGET_H
#define __WIDGET_H 0xCC

#include <SDL/SDL.h>
#include <string>
#include <stdexcept>
#include "../sdl/Font.h"

/**
 *  @brief Implementacja graficznego interfejsu uzytkownika.
**/
namespace gui
{
	/**
	 *  @brief Rodzaje zdarzen obslugiwanych przez widgety.
	**/
	enum Widget_e {
		E_KEYBOARD = 0x0001, /**< nacisniecie klawisza */
		E_MOUSEBUT = 0x0002, /**< nacisniecie przycisku myszy */
		E_MOUSEMOT = 0x0004  /**< ruch myszka */
	};
	/**
	 *  @brief Przechowuje dane dostarczane ze zdarzeniami. 
	**/
	union Event_t {
		unsigned long key;	/**< kod klawisza */
		unsigned short x, y;	/**< pozycja myszki */
	};

	typedef int (*callback_t)(Event_t*);

	/**
	 *  @brief Klasa abstrakcyjna okreslajaca sposob tworzenia
	 *  widgetow i dostarczajaca interfejs do tego celu
	**/
	class Widget
	{
     	   public:
		void addEvent(Widget_e, callback_t);
		void delEvent(Widget_e);
		void setEvent(Widget_e, Event_t) const;

	#if SDL_BYTEORDER == SDL_BIG_ENDIAN
		#define rmask	0xff000000
		#define gmask	0x00ff0000
		#define bmask	0x0000ff00
		#define amask	0x000000ff
	#else
		#define rmask	0x000000ff
		#define gmask	0x0000ff00
		#define bmask	0x00ff0000
		#define amask	0xff000000
	#endif

	#define newWidgetLayer(w, h)                  	      \
		SDL_CreateRGBSurface(SDL_SWSURFACE, w, h, 32, \
				     rmask,gmask,bmask,amask)

		Widget(Uint16, Uint16);
		virtual ~Widget();

		Sint16 __get_x() const {
			return dimension.x;
		}
		Sint16 __get_y() const {
			return dimension.y;
		}
		void __set_x(Sint16 x) {
			dimension.x = x;
		}
		void __set_y(Sint16 y) {
			dimension.y = y;
		}
		Uint16 __get_w() const {
			return dimension.w;
		}
		Uint16 __get_h() const {
			return dimension.h;
		}

		virtual int drawWidget() = 0;

	   protected:
	#define E_COUNT  0x00000003 /**< liczba obslugiwanych zdarzen */
		callback_t callback[E_COUNT];

		SDL_Surface *pixel; /**< powierzchnia graficzna widgetu */
		SDL_Rect dimension; /**< wymiar i pozycja  widgetu */
	};
}

#endif
